Image smoother

Time: O(M N); Space: O(1); easy*

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surrounding cells and itself. If a cell has less than 8 surrounding cells, then use as many as you can.

Example 1:

Input: M =

[
    [1,1,1],
    [1,0,1],
    [1,1,1]
]

Output:

[
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]

Explanation:

  • For the point (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0

  • For the point (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0

  • For the point (1,1): floor(8/9) = floor(0.88888889) = 0

Notes:

  • The value in the given matrix is in the range of [0, 255].

  • The length and width of the given matrix are in the range of [1, 150].

[2]:
class Solution1(object):
    def imageSmoother(self, M):
        """
        :type M: List[List[int]]
        :rtype: List[List[int]]
        """
        def getGray(M, i, j):
            directions = [[-1, -1], [0, -1], [1, -1], \
                          [-1,  0], [0,  0], [1,  0], \
                          [-1,  1], [0,  1], [1,  1]]

            total, count = 0, 0.0
            for direction in directions:
                ii, jj = i + direction[0], j + direction[1]
                if 0 <= ii < len(M) and 0 <= jj < len(M[0]):
                    total += M[ii][jj]
                    count += 1.0
            return int(total / count)

        result = [[0 for _ in range(len(M[0]))] for _ in range(len(M))]
        for i in range(len(M)):
            for j in range(len(M[0])):
                result[i][j] = getGray(M, i, j);
        return result
[4]:
s = Solution1()
M = [
    [1,1,1],
    [1,0,1],
    [1,1,1]
]
assert s.imageSmoother(M) == [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]